계수 정렬(Counting Sort)

Pasted image 20240809153333.png

요소 값들끼리 서로 비교하지 않고 정렬하는 알고리즘

시간복잡도

O(N + K) 으로 정렬 알고리즘 중 가장 빠르다
여기서 K는 배열의 최댓값이다

공간복잡도

O(배열 내 최댓값 + 1) 길이 만큼의 배열이 필요하기 때문에 메모리가 낭비될 수 있다

구현

  1. 원소 값의 개수를 저장하는 카운팅 배열을 만든다

  2. 직전 요소들의 값을 더한 누적 배열로 만든다
    Pasted image 20240809153823.png

  3. 입력 배열과 동일한 크기의 출력 배열을 만들고, 입력 배열의 역순으로 출력 배열 요소를 채운다
    Pasted image 20240809154135.png

특징

코드

function countingSort(arr) {
  // 배열의 사이즈를 최대값 9가 담기도록 크게 잡기
  const MAX_DATA_VALUE = 10;
  const counting = new Array(MAX_DATA_VALUE).fill(0);

  for (let i = 0; i < arr.length; i++) {
    counting[arr[i]]++;
  }

  for (let i = 1; i < MAX_DATA_VALUE; i++) {
    counting[i] += counting[i - 1];
  }

  const sorted = new Array(arr.length).fill(0);

  for (let i = arr.length - 1; i >= 0; i--) {
    sorted[counting[arr[i]] - 1] = arr[i];
    counting[arr[i]]--;
  }

  return sorted;
}